package com.demo.inboundhandlerandoutboundhandler.client;

import io.netty.buffer.Unpooled;
import io.netty.channel.ChannelHandlerContext;
import io.netty.channel.SimpleChannelInboundHandler;
import io.netty.util.CharsetUtil;
import io.netty.util.ReferenceCountUtil;

/**
 * @author gy
 * @date 2022/7/31
 */
public class MyClientHandler extends SimpleChannelInboundHandler<Long> {
    @Override
    protected void channelRead0(ChannelHandlerContext ctx, Long msg) throws Exception {

        // 客户端 业务处理handler 在收到服务端发送过来的数据时进行处理
        System.out.println("客户端 业务处理handler 在收到服务端发送过来的数据时进行处理");
        System.out.println("服务器的ip=" + ctx.channel().remoteAddress());
        System.out.println("收到服务器消息=" + msg);

    }

    @Override
    public void channelActive(ChannelHandlerContext ctx) throws Exception {
        System.out.println("MyClientHandler 发送数据");
        ctx.writeAndFlush(123456L); // 发送的是一个Long

        // 分析
        // 1."abcdabcdabcdabcd" 是 16个字节
        // 2. 该处理器的前一个handler 是 MyLongToByteEncoder 编码器 先编码，然后进入自己的业务处理类
        // 3. MyLongToByteEncoder 父类 MessageToByteEncoder
        // 4. 源码解读 为什么没走 long解码器
//        if (acceptOutboundMessage(msg)) {
//            @SuppressWarnings("unchecked")
//            I cast = (I) msg;
//            buf = allocateBuffer(ctx, cast, preferDirect);
//            try {
//                encode(ctx, cast, buf);
//            } finally {
//                ReferenceCountUtil.release(cast);
//            }
//
//            if (buf.isReadable()) {
//                ctx.write(buf, promise);
//            } else {
//                buf.release();
//                ctx.write(Unpooled.EMPTY_BUFFER, promise);
//            }
//            buf = null;
//        } else {
//            ctx.write(msg, promise);
//        }
        // 5.因此我们编写 Encoder 时要注意传入的数据类型和处理的数据类型一致
//        ctx.writeAndFlush(Unpooled.copiedBuffer("abcdabcdabcdabcd", CharsetUtil.UTF_8));
    }
}
